#include "AuthBase.h"

using namespace WONAPI;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
AuthBase::AuthBase(const void *theData, unsigned long theDataLen)
{
	mIsValid = false;
	if(theData==NULL || theDataLen==0)
		return;

	mRawBuf = new ByteBuffer(theData,theDataLen);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
AuthBase::~AuthBase()
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
bool AuthBase::Unpack()
{
	bool valid = false;
	if(mRawBuf.get()!=NULL)
	{
		try
		{
			ReadBuffer aReadData(mRawBuf->data(),mRawBuf->length());
			valid = UnpackHook(aReadData);
			if(valid) // get signature
			{
				mDataLen = aReadData.pos();
				if(aReadData.length()<=mDataLen) // no signature
					valid = false;
			}
		}
		catch(ReadBufferException&)
		{
		}
	}

	mIsValid = valid;
	return mIsValid;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
bool AuthBase::Verify(const ElGamal &theKey) const
{
	return theKey.Verify(GetData(),GetDataLen(),GetSig(),GetSigLen());
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
bool AuthBase::IsExpired(time_t theExtraTime) const
{
	if(!IsValid())
		return true;

	return mExpireTime <= time(NULL) + theExtraTime;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
bool AuthBase::UnpackHook(ReadBuffer &theData)
{
	mFamily = theData.ReadShort();
	mIssueTime = theData.ReadLong();
	mExpireTime = theData.ReadLong();
	return true;
};



